home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / inet / RCS / inet_network.c,v < prev    next >
Text File  |  1988-06-20  |  2KB  |  96 lines

  1. head     1.1;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.1
  9. date     88.06.20.09.44.33;  author ouster;  state Exp;
  10. branches ;
  11. next     ;
  12.  
  13.  
  14. desc
  15. @@
  16.  
  17.  
  18.  
  19. 1.1
  20. log
  21. @Initial revision
  22. @
  23. text
  24. @/*
  25.  * Copyright (c) 1983 Regents of the University of California.
  26.  * All rights reserved.
  27.  *
  28.  * Redistribution and use in source and binary forms are permitted
  29.  * provided that this notice is preserved and that due credit is given
  30.  * to the University of California at Berkeley. The name of the University
  31.  * may not be used to endorse or promote products derived from this
  32.  * software without specific prior written permission. This software
  33.  * is provided ``as is'' without express or implied warranty.
  34.  */
  35.  
  36. #if defined(LIBC_SCCS) && !defined(lint)
  37. static char sccsid[] = "@@(#)inet_network.c    5.4 (Berkeley) 3/7/88";
  38. #endif /* LIBC_SCCS and not lint */
  39.  
  40. #include <sys/types.h>
  41. #include <netinet/in.h>
  42. #include <ctype.h>
  43.  
  44. /*
  45.  * Internet network address interpretation routine.
  46.  * The library routines call this routine to interpret
  47.  * network numbers.
  48.  */
  49. u_long
  50. inet_network(cp)
  51.     register char *cp;
  52. {
  53.     register u_long val, base, n;
  54.     register char c;
  55.     u_long parts[4], *pp = parts;
  56.     register int i;
  57.  
  58. again:
  59.     val = 0; base = 10;
  60.     if (*cp == '0')
  61.         base = 8, cp++;
  62.     if (*cp == 'x' || *cp == 'X')
  63.         base = 16, cp++;
  64.     while (c = *cp) {
  65.         if (isdigit(c)) {
  66.             val = (val * base) + (c - '0');
  67.             cp++;
  68.             continue;
  69.         }
  70.         if (base == 16 && isxdigit(c)) {
  71.             val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
  72.             cp++;
  73.             continue;
  74.         }
  75.         break;
  76.     }
  77.     if (*cp == '.') {
  78.         if (pp >= parts + 4)
  79.             return (INADDR_NONE);
  80.         *pp++ = val, cp++;
  81.         goto again;
  82.     }
  83.     if (*cp && !isspace(*cp))
  84.         return (INADDR_NONE);
  85.     *pp++ = val;
  86.     n = pp - parts;
  87.     if (n > 4)
  88.         return (INADDR_NONE);
  89.     for (val = 0, i = 0; i < n; i++) {
  90.         val <<= 8;
  91.         val |= parts[i] & 0xff;
  92.     }
  93.     return (val);
  94. }
  95. @
  96.